Руководство администратора

Описание структуры и настроек системы

Меню

В левой части окна расположена панель с названием системы и значком доступности сервера. Ниже находится меню.

Рисунок 1. Меню системы

Сценарии

Сценарий — последовательность действий, которые выполняются при запуске задачи.

При выборе пункта меню «Сценарии» область окна правее области меню делится на 2 части, которые позволяют создавать новые сценарии и настраивать существующие.

Рисунок 2. Список сценариев и пример сценария

В первой части расположена панель с названием пункта меню и кнопками операций со сценариями , с помощью которых можно обновить список сценариев, создать новый сценарий, создать копию сценария, переименовать и удалить выбранный сценарий. Все операции похожи на операции с задачами (подробнее можно посмотреть «Руководство пользователя»).

Во второй части расположено окно для редактирования выбранного сценария. Создавать сценарии может администратор системы MARS.

Для обновления содержимого окна редактора сценариев надо нажать кнопку . После изменения сценария для сохранения сделанных изменений надо нажать кнопку . Кнопка позволяет сделать форматирование выделенного текста. Нажатие на кнопку отображает/скрывает порядковые номера строк редактируемого текста.

Коллекции

При двойном щелчке левой клавишей мыши на этом пункте появляются/скрываются подпункты этого меню. Это контейнер, содержащий два подпункта: «Медиа» и «Абоненты».

Медиа

При выборе пункта меню «Медиа» правее панели меню появляется панель «Медиа», где отображается коллекция аудио файлов, доступных для использования в сценариях.

Рисунок 3. Общий вид меню "Медиа"

Операции с коллекцией медиа

Для совершения той или иной операции с коллекцией медиа надо нажать соответствующую этой операции кнопку.

- обновление содержимого коллекции;

- создание нового каталога в текущем каталоге коллекции. При нажатии на эту кнопку появляется окно с полем ввода для задания имени нового каталога.

Рисунок 4. Запрос на ввод имени нового каталога коллекции медиа

Надо ввести новое имя и нажать кнопку «ОК» для создания каталога или нажать кнопку «Отмена» для отказа от создания каталога.

- добавить новый аудио файл в коллекцию медиа. При нажатии этой кнопки появляется окно, где можно добавлять медиа файлы в коллекцию.

Рисунок 5. Добавление файлов в коллекцию медиа

При появлении этого окна в нём нет никаких файлов. Для добавления файлов в коллекцию их надо выбрать. Делается этого при помощи нажатия кнопки «Обзор» в левом верхнем углу этого окна. Появится другое окно, где можно выбрать один или несколько аудио файлов. После подтверждения выбора эти файлы или файл появятся в окне добавления файлов. Но это действие ещё не добавляет файлы в коллекцию, а только подготавливает список файлов для добавления. То есть, ещё не загружая, какие-то выбранные файлы можно удалить, а оставшиеся уже загрузить в коллекцию. Для этого надо нажать кнопку , чтобы уже добавить выбранный файл в коллекцию. В процессе загрузки файла можно отменить его загрузку. Для этого надо нажать кнопку . После загрузки файл появляется в окне содержимого коллекции файлов медиа.

- изменить имя медиа файла. При нажатии это кнопки появляется окно, где можно задать новое имя файла, изменив старое в поле ввода.

Рисунок 6. Переименование файла медиа

Для подтверждения изменения надо нажать кнопку «ОК», для отмены изменения нажать кнопку «Отмена».

- удалить файл из коллекции медиа. При нажатии этой кнопки появляется окно с подтверждением удаления.

Рисунок 7. Удаление файла медиа

Для подтверждения надо нажать кнопку «Да», для отказа нажать кнопку «Нет».

Выбранный файл в коллекции можно прослушать. Для управления прослушиванием можно использовать проигрыватель, который находится между заголовком медиа и строкой кнопок по операциям с файлами медиа.

Рисунок 8. Проигрыватель файлов медиа

Этот проигрыватель позволяет запустить/остановить проигрывание, регулировать громкость звука и находить нужное место в проигрываемом файле.

- воспроизвести файл, - поиск нужного места в файле с помощью перетаскивания бегунка, - регулировка и отключения/включения громкости звука.

Настройки

Здесь можно настраивать параметры системы. Настройки хранятся в JSON формате. Настроечный файл содержит следующие поля:

  • mPort – порт для соединения с системой по telnet удалённых клиентов;
  • sipPort — порт по которому система будет подключаться к к SIP шлюзу. Если шлюзов несколько, номер порта будет автоматически увеличен;
  • webPort — порт на котором будет запускаться web сервер системы;
  • stunServer — адрес stun сервера;
  • webAccounts — массив объектов, содержащий настройки пользователей. Каждый элемент массива настройки отдельного пользователя, содержащий следующие поля:
    • id — идентификатор пользователя,
    • username — имя пользователя,
    • password — пароль пользователя,
    • email — адрес эл. почты пользователя;
  • maxCalls — максимальное количество одновременных звонков системы;
  • logLevel — объект, поля которого обозначают категории логгирования, значения — минимальный уровень логгирования (для настроек log4js);
  • ringingTimeout — время дозвона в секундах (по истечении этого времени диалог прекращается);
  • serviceName — имя сервиса, отображаемое при входящем звонке;
  • activeAccount — текущий (активный) аккаунт (задётся номер в массиве sipAccounts);
  • def_tts — система синтеза речи по умолчанию;
  • ivona_speech — объект с настройками системы синтеза речи ivona, содержащий следующие поля:
    • accessKey — строка, содержащая ключ доступа
    • secretKey — строка, содержащая серетный ключ
    • language — язык синтеза речи (для русского: "ru-RU")
    • name — имя робота, произносящего текст
    • gender — пол, произносящего текст;
  • recognize — объект с настройками внешней системы распознавания голоса, содержащий следующие поля:
    • type – имя внешней системы распознавания голоса (пока одно значение "yandex")
    • options – объект с настройками:
      • developer_key – ключ разработчика
      • model – модель распознавания голоса (general – общая модель распознавания, numbers – модель распознавания цифр и чисел);
  • sipAccounts — массив объектов, содержащий настройки шлюзов. Каждый элемент массива является объектом, хранящим настройки шлюза. Для настройки шлюза указываются следующие поля:
    • host — адрес сервера,
    • comment — комментарий к шлюзу,
    • expires — время в секундах, через которое система будет подтверждать регистрацию на шлюзе,
    • user — имя пользователя шлюза,
    • password — пароль пользователя шлюза,
    • disable — разрешить или запретить активацию шлюза (1 — разрешить, 0 — запретить).

Каталоги системы

Система содержит следующие каталоги, которые содержат:

tasks — файлы с задачами для системы;

config — файл конфигурации системы;

data – файл базы данных системы, куда пишутся отчёты;

doc – руководства пользователя и администратора системы;

media – звуковые файлы для сценариев;

rec – файлы записанных сообщений;

scripts – файлы сценариев системы.

Описание и примеры команд сценариев обработки звонков

Сценарий должен быть в формате Javascript объекта.

Ключ - команда или параметр, значение - параметр или значение параметра.

Все команды записываются в виде:

<команда> : <значение>, где значением может быть число, строка или объект.

Исполнение команд асинхронное. Чтобы исполнить команды синхронно, необходимо использовать свойство next.

Допустимы следующие команды

В примерах фоновым цветом выделены строки, относящиеся непосредственно к описываемой команде.

dtmfData - Включает запись в CDR (в файл cdr.db в поле "data") нажатых клавиш клавиатуры телефона

синтаксис:

<dtmfData>::=true|{next: {<допустимые_команды>}};

Пример:

dtmfData:
    {next: {
            mark: 'Главное меню',
                play: {file: 'media/Спасибо_за_звонок.wav'},
                    dtmfOn: {
                        '1': {hangUp: true},
                            'def': {goto: 'Главное меню'}
                    },
                        wait: {time: 2,
                            next: {
                                    goto: 'Главное меню'
                                }
                            }
        }
    }

dtmfOn - включается обработка ввода с клавиатуры телефона (допустима комбинация нажатий)

синтаксис:

<dtmfOn>::={символ(ы)::=0|1|2|3|4|5|6|7|8|9|'#'|'*'| ['def'] | ['opt' ]: {<допустимые_команды>}, символ(ы), ...};

'def' - действие по умолчанию, 'opt' - параметры. Синтаксис: 'opt': {seq: true, endSeq: '#'}, где seq - указывет будет ли вводится последовательность, endSeq - указывает завершающий символ последовательности

Если endSeq отсутствует, завершающего символа не будет, а завершит последовательность длительная пауза между нажатиями.

В качестве символов может быть регулярное выражение.

Пример:

{
    mark: 'Главное меню',
    play: {file: 'media/Спасибо_за_звонок.wav'},
    dtmfOn: {
            'opt': {seq: true, endSeq: '#'},
            '1': {hangUp: true},
            'def': {goto: 'Главное меню'}
            },
    wait: {time: 2,
            next: {
                    goto: 'Главное меню'
                }
        }
}

sttOn - включается обработка ввода голосом

синтаксис:

<sttOn>::={символ(ы)::=0|1|2|3|4|5|6|7|8|9|'#'|'*'| ['def'] | ['opt' ]: {<допустимые_команды>}, символ(ы), ...};

'def' - действие по умолчанию, 'opt' - параметры. Синтаксис: 'opt': {model: <название>, textFilter: <regExp>}, где model – название модели для распознавания речи. Чтобы распознавание было на нужном уровне, надо указать правильную модель. Если не указан этот параметр, по умолчанию выбирается модель queries.

Допустимы следующие модели:

  • 'queries' — короткие запросы,
  • 'numbers' — цифры и числа,
  • 'general' — общий текст;

textFilter – регулярное выражение, ограничивающее передачу результатов распознавания в систему. Всё то, что не совпадает с результатом регулярного выражения не будет обработано системой. Можно не указывать этот параметр. Тогда не будет никакого ограничения на обработку результатов распознавания.

В качестве символов может быть регулярное выражение.

Пример:

{
    play: {file: 'media/Признесите 1, 2 или 3.wav', next: {
            mark: "Главное меню",
            sttOn: {
                'opt': {model: 'general', textFilter: '1|2|3'},
                '^1$': {play: {file: 'media/Сигнал_записи.wav',
                        next: {goto: "Главное меню"}}},
                '^2$': {play: {file: 'media/Спасибо_за_оценку.wav',
                        next: {goto: "Главное меню"}}},
                '^3$': {hangUp: true},
                'def': {goto: "Главное меню"}
            }
        }
    }
}

goto - оператор безусловного перехода с возвратом.

Переходит на метку, заданную командой mark. После перехода, выполняет команды (если они есть), находящиеся там же, что и goto, т.е. в пределах тех же фигурных скобок.

синтаксис:

<goto>::='имя_метки';

Пример:

{
    mark: 'Главное меню',
    play: {file: 'media/Спасибо_за_звонок.wav'},
    dtmfOn: {
            '1': {hangUp: true},
            'def': {goto: 'Главное меню'}
            },
    wait: {time: 2,
            next: {
                    goto: 'Главное меню'
                }
        }
}

hangUp - завершить соединение

синтаксис:

<hangUp>::=true;

Пример:

{
    mark: 'Главное меню',
    play: {file: 'media/Спасибо_за_звонок.wav'},
    dtmfOn: {
            '1': {hangUp: true},
            'def': {goto: 'Главное меню'}
            },
    wait: {time: 2,
            next: {
                    goto: 'Главное меню'
                }
        }
}

mark - задать метку

синтаксис:

<mark>::='имя_метки';

Пример:

{
    mark: 'Главное меню',
    play: {file: 'media/Спасибо_за_звонок.wav'},
    dtmfOn: {
            '1': {hangUp: true},
            'def': {goto: 'Главное меню'}
            },
    wait: {time: 2,
            next: {
                    goto: 'Главное меню'
                }
        }
}

on - включается обработка ввода с клавиатуры телефона (допустима комбинация нажатий) и обработка ввода голосом.

синтаксис:

<on>::={символ(ы)::=0|1|2|3|4|5|6|7|8|9|'#'|'*'| ['def'] | ['opt' ]: {<допустимые_команды>}, символ(ы), ...};

Это не команда, а надстройка, которая запускает с заданными параметрами команды sttOn и dtmfOn.

Пример:

{
ttsPlay: {text: 'Добрый день', 
            next: {
                    ttsPlay: {text: 'Что вас интересует', 
                                next: {
                                        mark: "Главное меню",
                                        on: {
                                            'opt': {model: 'general', textFilter: '[^а-я]'},
                                            '^1$|продаж': {recOn: true, ttsPlay: {text: 'Сейчас вы будете переведены в отдел продаж', next: {goto: "Главное меню"}}},
                                                '^2$|поддержк': {recOn: true, ttsPlay: {text: 'Сейчас вы будете переведены в отдел техподдержки', next: {goto: "Главное меню"}}}
                                            }
                                        }
                                }
                    }
        }
}

play - проиграть заданный файл

синтаксис:

<play>::={file: 'имя_файла[;имя_файла;...]'[, next]};

Можно проиграть несколько файлов подряд. Для этого надо указать имена файлов через знак ";" (без пробелов) вместо 'имя_файла'.

Пример:

{
    mark: 'Главное меню',
    play: {file: 'media/Здравствуйте.wav;media/Спасибо_за_звонок.wav'},
    dtmfOn: {
            '1': {hangUp: true},
            'def': {goto: 'Главное меню'}
            },
    wait: {time: 2,
            next: {
                    goto: 'Главное меню'
                }
        }
}

recOff - выключить запись звука и/или совершить заданные действия

синтаксис:

<recOff>::=true|{<допустимые_команды>};

Пример:

{
    recOn: true,
    mark: 'Главное меню',
    play: {file: 'media/Спасибо_за_звонок.wav'},
    dtmfOn: {
            'opt': {seq: true, endSeq: '#'},
            '1': {recOff: true, hangUp: true},
            'def': {goto: 'Главное меню'}
            },
    wait: {time: 2,
            next: {
                    goto: 'Главное меню'
                }
        }
}

recOn - включить запись звука и/или совершить заданные действия

синтаксис:

<recOn>::=true|{<допустимые_команды>};

Пример:

{
    recOn: true,
    mark: 'Главное меню',
    play: {file: 'media/Спасибо_за_звонок.wav'},
    dtmfOn: {
            'opt': {seq: true, endSeq: '#'},
            '1': {hangUp: true},
            'def': {goto: 'Главное меню'}
            },
    wait: {time: 2,
            next: {
                    goto: 'Главное меню'
                }
        }
}

refer - перенаправление вызова

синтаксис:

<refer>::={target: <цель>};

Пример:

{
    mark: 'Главное меню',
    play: {file:'media/Спасибо_за_звонок.wav',
            next: {refer: {target: 128}}
        }
}

require — подключение внешнего сценария (аналог команды include в с++).

синтаксис:

require('имя_сценария.js').src

Пример:

{
ttsPlay: {text: 'Добрый день', 
            next: {
                    ttsPlay: {text: 'Что вас интересует', 
                                next: {
                                        mark: "Главное меню",
                                        on: {
                                            'opt': {model: 'general', textFilter: '[^а-я]'},
                                            '^1$|продаж': {recOn: true, ttsPlay: {text: 'Сейчас вы будете переведены в отдел продаж', next: {goto: "Главное меню"}}},
                                                '^2$|поддержк': {recOn: true, ttsPlay: {text: 'Сейчас вы будете переведены в отдел техподдержки', next: {goto: "Главное меню"}}},
                                                '^3$|опрос': require('./12345.js').src,
                                            }
                                        }
                                }
                    }
        }
}

sendMESSAGE - отправка SIP-сообщения.

синтаксис:

<sendMESSAGE>::={text: 'текст_сообщения'[, to: <sip_uri>, next]};

to – поле адреса в формате SIP URI: 'sip: id@domain'.

В качестве шлюза используется текущий.

Пример:

{
sendMESSAGE: {text: '[<session_id>] Тестовая передача MESSAGE', to: 'sip:digt11@sipnet.ru',
        next: {ttsPlay: {text: 'Сообщение отправлено', next: {hangUp: true}}}
                }
}

sendSMS - отправка SMS. В качестве SMS шлюза поддерживается только оператор «Мегафон».

синтаксис:

<sendSMS>::={text: 'текст_сообщения'[, msisdn: <отослать_на_номер>, next]};

Если отсутствует параметр msisdn, то сообщение отсылается на номер того, кто позвонил в систему MARS, в случае входящего звонка, и на номер того, кому звонит система MARS, в случае исходящего звонка.

В качестве шлюза используется multifon.ru. Перед отправкой сообщения multifon.ru ищется среди активных шлюзов. И если будет найден, сообщение отсылается, иначе не отсылается.

Пример:

{
    play: {file: 'media/Приветствие.wav',
        next: {
            mark: "Главное меню",
            dtmfOn: 
            {
                '[1-5]': {
                        sendSMS: {text: 'Ваша оценка <dtmfKeys>. Спасибо за звонок!', next: {hangUp: true}}
                        },
                'def': {goto: "Главное меню"}
            },
            play: {file: 'media/Оцените_работу_оператора.wav'},
            wait: {time: 15,
                next: {hangUp: true}
            }
        }
    }
}

stopPlay - останавливает проигрывание файла

синтаксис:

<stopPlay>::={<допустимые_команды>};

Пример:

{
    mark: "Главное меню",
    play: {file: 'media/123_тест.wav'},
    dtmfOn: {
        '3': {hangUp: true},
        '4': {stopPlay: {next: {goto: "Главное меню"}}},
        '5': {play: {file: 'media/Сигнал_записи.wav', next: {goto: "Главное меню"}}},
        'def': {goto: "Главное меню"}
    }
}

stt - перевод речи (из файла) в текст

синтаксис:

<stt>::={file: 'имя_файла_с_речью'[, next]};

Пример:

{
    play: {file: 'media/123_тест.wav',
        next: {
            mark: "Главное меню",
            dtmfOn: {
                '1': {
                        stt: {file: 'rec/<session_id>.wav'}
                    },
                '2': {hangUp: true},                
                '3': {tts: {text: 'Добрый день', 
                            next: {play: {file: '<ttsFile>', 
                                next: {goto: "Главное меню"}}}}},
                'def': {goto: "Главное меню"}
            }
        }
    }
}

tts - синтезирование речи

синтаксис:

<tts>::={text: 'текст_для_синтеза_речи'[, next]};

Пример:

{
    play: {file: 'media/123_тест.wav',
        next: {
            mark: "Главное меню",
            dtmfOn: {
                '1': {
                        stt: {file: 'rec/<session_id>.wav'}
                    },
                '2': {hangUp: true},                
                '3': {tts: {text: 'Добрый день', 
                            next: {play: {file: '<ttsFile>', 
                                next: {goto: "Главное меню"}}}}},
                'def': {goto: "Главное меню"}
            }
        }
    }
}

ttsPlay – синтезирование речи с её произнесением

синтаксис:

<ttsPlay>::={text: 'текст_для_синтеза_и_произнесения_речи'[, rewrite: true, type:<название_синтезатора_речи>, next]};

text – текст для синтеза

rewrite – если true, то указывает, что нужно стирать ранее записанный файл со сгенерированным голосом

type – указывает какая внешняя система синтеза речи будет использоваться (допустимые значения: 'ivona', 'yandex').

Пример:

{
    mark: 'Главное меню',
    ttsPlay: {rewrite: true, type:'ivona', text:'Спасибо за звонок',
            next: {goto: 'Главное меню'}
        }
}

wait - ожидание в секундах

синтаксис:

<wait>::={time: <количество_секунд>[, next]};

Пример:

{
    mark: 'Главное меню',
    play: {file: 'media/Спасибо_за_звонок.wav'},
    dtmfOn: {
            '1': {hangUp: true},
            'def': {goto: 'Главное меню'}
            },
    wait: {time: 2,
            next: {
                    goto: 'Главное меню'
                }
        }
}

request — запрос к данным, сформированным к моменту выполнения этой команды;

синтаксис:

<request>::={sourse: <запрашиваемые_данные>[, <необходимое_свойство>: <значение_свойства>][, next]};

В командах, значением которых может быть объект, допустимо свойство next:

next - действие, аналогичное функции обратного вызова в Javascript

синтаксис:

<next>::={<допустимые_команды>}

Пример:

{
    mark: 'Главное меню',
    ttsPlay: {text:'Спасибо за звонок',
            next: {goto: 'Главное меню'}
        }
}

Там, где подставляются статические значения параметров, можно писать функции в синтаксисе Javascript c возвратом нужного значения.

Например:

{
    ttsPlay: {text: 'Добрый день', next: {
            request: {source: 'reportData', query: function () {
                    return {search: JSON.stringify({msisdn: '<caller>'}), start: 0, limit: 1, page: 1, sort: JSON.stringify([{property: 'gdate', direction: 'DESC'}])}
                }, next: {
                    ttsPlay: {text: function () {
                            var res = request && request.items || [];;
                            if (!res.length)
                                return 'Вы позвонили впервые';
                            var time = res[0].gdate.replace(/^(\d{4})\.(\d{2})\.(\d{2}) (\d{2}\:\d{2}\:\d{2})/, '$4 $3.$2.$1');
                            return 'Последний раз вы звонили в ' + time;
                        }
                    }
                }
            }
        }
    }
}

Используются следующие переменные:

  • <dtmfKeys> - распознанные нажатые клавиши или последовательность нажатий;
  • <sttText> - имя текущего файла, который содержит текст, произнесённый голосом;
  • <ttsFile> - имя текущего файла, который содержит голос, синтезированный из текста;
  • <session_id> - идентификатор текущего сеанса;
  • <requestRes> - результат работы команды request;
  • <caller> - идентификатор звонящего;
  • <called> - идентификатор вызываемого;
  • <pin> - pin-код, вычисляющийся на основе идентификатора позвонившего.

Эти переменные можно использовать в строковых значениях, заключив эти переменные в угловые скобки: <название_переменной>.